﻿#include<iostream>
#include<vector>
using namespace std;
////非继承
//class Student
//{
//public:
//	// 身份认证
//	void identity()
//	{ /* ... */ }
//	// 学习 
//	void study()
//	{ /* ... */ }
//protected:
//	string _name; // 姓名 
//	string _address; // 地址 
//	string _tel; // 电话 
//	int _age; // 年龄 
//	string _stuid; // 学号 
//};
//class Teacher
//{
//public:
//	// 身份认证
//	void identity()
//	{ /* ... */ }
//	// 教书 
//	void teach()
//	{ /* ... */ }
//protected:
//	string _name; // 姓名 
//	string _address; // 地址 
//	string _tel; // 电话 
//	int _age; // 年龄 
//	string _title; // 职称
//};
//继承
//class Person//基类
//{
//public:
//	// 身份认证
//	void identity()
//	{ cout << "void identity()" << endl; }
//protected:
//	string _name; 
//	string _address; 
//	string _tel; 
//	int _age; 
//};
//class Student :public Person
//{
//public:
//	void study() { cout << "void study()" << endl; }
//protected:
//	string _stuid;
//};
//class Teacher :public Person
//{
//public:
//	void teach() { cout << "void teach()" << endl; }
//protected:
//	string _title;
//};
//class Person
//{
//public:
//	void Print1()  { cout << "void Print2()" << endl; }
//protected:
//	void Print2()  { cout << "void Print2()" << endl; }
//private:
//	string _name = "小明";
//};
//class Student :public Person// 公有继承---基类的public与protected在派生类中限定不变
//{
//protected:
//	string _stuid;
//};
//class Student :protected Person// 保护继承---基类的public与proteceted在派生类中限定都变为protected
//{
//protected:
//	string _stuid;
//};
//class Student :private Person// 私有继承---基类的public与proteceted在派生类中限定都变为private
//{
//protected:
//	string _stuid;
//};
//让Stack继承vector，去实现Stack的功能
//namespace hl
//{
//	template<class T>
//	class Stack :public std::vector<T>
//	{
//	public:
//		void push(const T& x)            //必须指定类域，因为是按需实例化，
//		{	push_back(x); }              //此时还没有实例化vector中的push_back                                                           
//		const T& top()                   //编译器会找不到对应的函数接口而报错
//		{   return vector<int>::back(); }//同理
//		void pop()
//		{	vector<int>::pop_back(); }
//		bool empty()
//		{	return vector<int>::empty(); }
//	};
//}
//int main()
//{
//	//Student s;
//	//Teacher t;
//	//s.identity(); t.identity();
//	//s.study(); t.teach();
//	hl::Stack<int> st;
//	st.push(1);
//	st.push(2);
//	st.push(3);
//	while (!st.empty())
//	{
//		cout << st.top() << endl;
//		st.pop();
//	}
//	return 0;
//}
//class Person
//{
//protected:
//	string _name; 
//	string _sex;  
//	int _age; 
//};
//class Student : public Person
//{
//public:
//	int _stuid; 
//};
//int main()
//{
//	Student sobj;
//	// 1.派生类对象可以赋值给基类的指针/引用 
//	Person* pp = &sobj;
//	Person& rp = sobj;
//	// 派生类对象可以赋值给基类的对象 
//	Person pobj = sobj;
//	// 2.基类对象不能赋值给派生类对象，这里会编译报错 
//	//sobj = pobj;
//	// 3.支持基类对象指针(或引用)强制类型转换赋值给派生类对象指针或者引用
//	Student* ps = (Student*)pp;
//	Student& rs = (Student&)rp;
//	return 0;
//}
//class Person
//{
//protected:
//	string _name = "小梦";
//	int _id = 2004;
//};
//class Student :public Person
//{
//public:
//	void Print()
//	{
//		cout << "姓名：" << _name << endl;
//		cout << "身份证号：" << Person::_id << endl;
//		cout << "地址：" << _address << endl;
//		cout << "年龄：" << _age << endl;
//		cout << "学号：" << _id << endl;
//	}
//protected:
//	string _address = "SXIT";
//	int _age = 18;
//	int _id = 666;
//};
//struct A
//{
//	void Func() { cout << "void Func()" << endl; }
//};
//struct B :public A
//{
//	void Func(int i) { cout << "void Func(int i)" << endl; }
//};
//int main()
//{
//	B b;
//	b.Func(1);
//	b.A::Func();
//	return 0;
//}
//class Person
//{
//public:
//	Person(const char* name) :_name(name){ cout << "Person()" << endl; }
//	Person(const Person& p) :_name(p._name){ cout << "Person(const Person& p)" << endl; }
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//		return *this;
//	}
//	~Person() { cout << "~Person()" << endl; }
//protected:
//	string _name; // 姓名 
//};
//class Student : public Person
//{
//public:
//	Student(const char* name, int num):Person(name),_num(num) { cout << "Student()" << endl; }
//	Student(const Student& s) :Person(s) { cout << "Student(const Student& s)" << endl; }
//	Student& operator = (const Student& s)
//	{
//		cout << "Student& operator= (const Student& s)" << endl;
//		if (this != &s)
//		{
//			// 构成隐藏，所以需要显⽰调⽤ 
//			Person::operator =(s);
//			_num = s._num;
//		}
//		return *this;
//	}
//	~Student() { cout << "~Student()" << endl;}
//protected:
//	int _num; //学号 
//};
//int main()
//{
//	Student s1("jack", 18);
//	Student s2(s1);
//	Student s3("rose", 17);
//	s1 = s3;
//	return 0;
//}
//class A final
//{
//public:
//	A() { cout << "A()" << endl; }
//};
//class B :public A
//{
//protected:
//	int _a;
//};
//int main()
//{
//	B b;
//	return 0;
//}
//class Student;//前置声明
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名 
//};
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号 
//};
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;
//}
//int main()
//{
//	Person p;
//    Student s;
//	// 编译报错：error C2248: “Student::_stuNum”: ⽆法访问 protected 成员 
//	// 解决⽅案：Display也变成Student 的友元即可 
//	Display(p, s);
//	return 0;
//}
//class Person
//{
//public:
//	string _name;
//	static int _count;
//};
//int Person::_count = 0;//静态成员必须类外初始化
//class Student : public Person
//{
//protected:
//	int _stuNum;
//};
//int main()
//{
//	Person p;
//	Student s;
//	// 这里的运行结果可以看到非静态成员_name的地址是不一样的 
//	// 说明派生类继承下来了，基类和派生类对象各有一份 
//	cout << &p._name << endl;
//	cout << &s._name << endl;
//	// 这里的运行结果可以看到静态成员_count的地址是一样的 
//	// 说明派生类和基类共用同一份静态成员 
//	cout << &p._count << endl;
//	cout << &s._count << endl;
//	// 公有的情况下，父或派生类指定类域都可以访问静态成员 
//	cout << Person::_count << endl;
//    cout << Student::_count << endl;
//	// ++影响的是同一个变量
//	++Person::_count;
//	cout << Person::_count << endl;
//	cout << Student::_count << endl;
//	++Student::_count;
//	cout << Person::_count << endl;
//	cout << Student::_count << endl;
//	return 0;
//}
//class Person
//{
//public:
//    string _name; // 姓名 
//};
//class Student : public Person
//{
//protected:
//	int _num; //学号 
//};
//class Teacher :  public Person
//{
//protected:
//	int _id; // 职⼯编号 
//};
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程 
//};
//int main()
//{
//	// 编译报错：error C2385: 对“_name”的访问不明确 
//	Assistant a;
//	//a._name = "peter";
//	// 需要显⽰指定访问哪个基类的成员可以解决⼆义性问题，但是数据冗余问题⽆法解决 
//	a.Student::_name = "xxx";
//	a.Teacher::_name = "yyy";
//	cout << sizeof(Person) << endl;
//	cout << sizeof(Student) << endl;
//	cout << sizeof(Teacher) << endl;
//	cout << sizeof(Assistant) << endl;
//	return 0;
//}
//class Person
//{
//public:
//	string _name; // 姓名 
//};
//class Student :  public Person
//{
//protected:
//	int _num; //学号 
//};
//class Teacher :  public Person
//{
//protected:
//	int _id; // 职⼯编号 
//};
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程 
//};
//int main()
//{
//	Assistant a;
//	cout << sizeof(Person) << endl;
//	cout << sizeof(Student) << endl;
//	cout << sizeof(Teacher) << endl;
//	cout << sizeof(Assistant) << endl;
//	return 0;
//}
// Tire(轮胎)和Car(⻋)更符合组合的关系 
//class Tire {
//protected:
//	string _brand = "Michelin"; // 品牌 
//	size_t _size = 17; // 尺寸 
//};
//class Car {
//protected:
//	string _colour = "白色"; // 颜色 
//	string _num = "陕ABIT00"; // ⻋牌号 
//	Tire _t1; // 轮胎 
//	Tire _t2; // 轮胎 
//	Tire _t3; // 轮胎 
//	Tire _t4; // 轮胎 
//};
//class BMW : public Car {
//public:
//	void Drive() { cout << "好开-操控" << endl; }
//};
//// Car和BMW/Benz更符合继承的关系 
//class Benz : public Car {
//public:
//	void Drive() { cout << "好坐-舒适" << endl; }
//};
//template<class T>
//class vector
//{};
//// stack和vector的关系，既符合is-a，也符合has-a 
//template<class T>
//class stack : public vector<T>
//{};
//template<class T>
//class stack
//{
//public:
//	vector<T> _v;
//};
//int main()
//{
//	return 0;
//}